package org.jeecg.modules.demo.util;

import com.aliyun.ocr_api20210707.models.RecognizeInvoiceResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
@Slf4j
@Component
public class KingdeeUtil {

    public static List<Map<String, Object>> convertExcelToMapList(String filePath,int titleRow,int headRow,boolean isFirstRowAsTitle,int sheetNum) throws Exception {
        List<Map<String, Object>> resultList = new ArrayList<>();
        InputStream fileStream = new FileInputStream(filePath);
        // 使用AutoPoi导入Excel数据
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRow==0?titleRow:titleRow+2); // 跳过标题行
//        params.setHeadRows(1);
        params.setSheetNum(sheetNum);
        params.setStartSheetIndex(sheetNum);
        try {
            List<Map<String, Object>> dataList = ExcelImportUtil.importExcel(
                    fileStream,
                    Map.class,
                    params
            );


            // 2. 清洗表头key：遍历原始数据的每个key，删除其中的\n
            List<Map<String, Object>> cleanedDataList = new ArrayList<>();
            for (Map<String, Object> originalRow : dataList) {
                Map<String, Object> cleanedRow = new HashMap<>();
                for (Map.Entry<String, Object> entry : originalRow.entrySet()) {
                    // 关键操作：删除key中的\n，若key为null则保持null
                    String originalKey = entry.getKey();
                    String cleanedKey = originalKey != null ? originalKey.replace("\n", "") : null;
                    // 用清洗后的key重新存储数据
                    cleanedRow.put(cleanedKey, entry.getValue());
                }
                cleanedDataList.add(cleanedRow);
            }

            if(isFirstRowAsTitle){
                // 筛选A列含数字的行并转换
                for(Map<String, Object> row : cleanedDataList) {
                    Object colA = row.get("序号"); // 假设A列对应key为"A"
                    if(colA != null && String.valueOf(colA).matches(".*\\d+.*")) {
                        resultList.add(row);
                    }
                }
                return resultList;
            }else {
                for(Map<String, Object> row : cleanedDataList) {
                    Object orderNo = row.get("客户订单号");
                    // 检查客户订单号是否不为空且不是空字符串
                    if (orderNo != null && !String.valueOf(orderNo).trim().isEmpty()) {
                        resultList.add(row);
                    }
                }
                return resultList;
            }

        } catch (Exception e) {
            log.info("提取对账单Excel数据异常：", e.getMessage());
            e.printStackTrace();
        }

        return resultList;
    }

    public static List<Map<String, Object>> convertExcelToMapListNormal(String filePath,int titleRow,int headRow,boolean isFirstRowAsTitle,int sheetNum) throws IOException {
        List<Map<String, Object>> resultList = new ArrayList<>();
        InputStream fileStream = null; // 移到try外，确保finally能关闭
        try {
            fileStream = new FileInputStream(filePath);
        // 使用AutoPoi导入Excel数据
        ImportParams params = new ImportParams();
        params.setTitleRows(0); // 跳过标题行
        params.setHeadRows(1);
//        params.setSheetName("Sheet0");
        List<Map<String, Object>> dataList = ExcelImportUtil.importExcel(
                fileStream,
                    Map.class,
                    params
            );
            return dataList;

        } catch (Exception e) {
            log.info("提取对账单Excel数据异常：", e.getMessage());
            e.printStackTrace();
        }finally {
//            fileStream.close();
        }

        return null;
    }

    public static void cleanExcelFormats(String inputFilePath, String outputFilePath) throws Exception {
        Workbook workbook = null;
        InputStream is = null;
        OutputStream os = null;

        try {
            // 1. 根据文件后缀创建对应的Workbook（支持xls和xlsx）
            is = new FileInputStream(inputFilePath);
            if (inputFilePath.toLowerCase().endsWith(".xlsx")) {
                workbook = new XSSFWorkbook(is);
            } else if (inputFilePath.toLowerCase().endsWith(".xls")) {
                workbook = new HSSFWorkbook(is);
            } else {
                throw new IllegalArgumentException("不支持的文件格式，仅支持.xls和.xlsx");
            }

            // 2. 获取默认单元格样式（无格式）

            // 2. 创建真正的"无格式"样式（清除所有格式属性）
            CellStyle defaultStyle = workbook.createCellStyle();
            // 清除字体格式（如果需要保留默认字体，可去掉此行）
            defaultStyle.setFont(workbook.getFontAt((short) 0)); // 使用 workbook 默认字体
            // 清除数字格式（避免日期、货币等格式残留）
            defaultStyle.setDataFormat((short) 0);
            // 清除对齐方式（使用默认对齐）
            defaultStyle.setAlignment(HorizontalAlignment.GENERAL);
            defaultStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // 清除边框（可选，根据需求保留或清除）
            defaultStyle.setBorderTop(BorderStyle.NONE);
            defaultStyle.setBorderBottom(BorderStyle.NONE);
            defaultStyle.setBorderLeft(BorderStyle.NONE);
            defaultStyle.setBorderRight(BorderStyle.NONE);
            // 清除填充色
            defaultStyle.setFillForegroundColor(IndexedColors.AUTOMATIC.getIndex());
            defaultStyle.setFillPattern(FillPatternType.NO_FILL);
            // 3. 遍历所有Sheet
            for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) {
                Sheet sheet = workbook.getSheetAt(sheetIndex);
                if (sheet == null) {
                    continue;
                }

                // 4. 遍历Sheet中的所有行（包括空行）
                int lastRowNum = sheet.getLastRowNum();
                for (int rowIndex = 0; rowIndex <= lastRowNum; rowIndex++) {
                    Row row = sheet.getRow(rowIndex);
                    if (row == null) {
                        continue;
                    }
                    // 关键：恢复行高为默认值（-1表示使用Excel默认行高）
                    row.setHeight((short) -1);
                    // 5. 遍历行中的所有单元格
                    int lastCellNum = Math.max(row.getLastCellNum(), 30); // 假设最多30列
                    for (int cellIndex = 0; cellIndex < lastCellNum; cellIndex++) {
                        Cell cell = row.getCell(cellIndex);
                        if (cell == null) {
                            continue;
                        }
                        // 关键：强制转换为纯文本（保留原始值的字符串形式）
                        String cellValue = getCellStringValue(cell);
                        cell.setCellType(CellType.STRING);
                        cell.setCellValue(cellValue); // 用字符串重新赋值
                        cell.setCellStyle(defaultStyle); // 应用纯文本样式
                        // 6. 清除单元格格式（设置为默认样式）
                        cell.setCellStyle(defaultStyle);
                    }
                }
            }

            // 7. 保存处理后的文件
            os = new FileOutputStream(outputFilePath);
            workbook.write(os);
            System.out.println("Excel格式清除完成，保存路径：" + outputFilePath);

        } finally {
            // 关闭资源
            if (is != null) {
                is.close();
            }
            if (os != null) {
                os.close();
            }
            if (workbook != null) {
                workbook.close();
            }
        }
    }


    // 辅助方法：将任意类型的单元格值转为字符串（保留原始显示效果）
    private static String getCellStringValue(Cell cell) {
        if (cell == null) return "";
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 日期类型转为字符串（避免被解析为数字）
                    return cell.getDateCellValue().toString();
                } else {
                    // 数字类型转为字符串（保留原始数值）
                    return String.valueOf(cell.getNumericCellValue());
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                // 公式结果转为字符串
                return cell.getCellFormula(); // 或用evaluator计算结果
            default:
                return "";
        }
    }
}
